package org.infosec.lc.exercises.castor;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.infosec.lc.exercises.castor.dome.CastorUDPReceive;
import org.infosec.lc.exercises.castor.dome.CastorUDPSend;
import org.infosec.lc.exercises.castor.modle.Person;

/**
	文件名：CastorMain.java
	作  者：林超
	时  间：2011-7-19下午03:08:34

	功能描述：含在两个主要的类org.exolab.castor.xml.Marshaller和org.exolab.castor.xml.Unmarshaller中。
		Marshaller:将JavaBean转换为XML
		Unmarshaller：将XML转换为JavaBean
	
	pom.xml	:<!-- 将JavaBean转换为XML -->
        <dependency>
            <groupId>org.codehaus.castor</groupId>
            <artifactId>castor-xml</artifactId>
            <version>1.3.1</version>
        </dependency>
			
 */
public class CastorMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//以下为Castor的两种模式
//		Introspection();//自省方式
//		Mapping();//映射文件方式
		
		//TODO 只生成部分属性的XML，可以通过自定义Mapping映射文件
		
		//真实使用的例子
		Person person = new Person();
		person.setName("张三");
		person.setBirthday(new Date());
		
		//创建接收端
		CastorUDPReceive udpReceive = new CastorUDPReceive();
		new Thread(udpReceive,"UDPReceive").start();
		
		//创建发送端
		CastorUDPSend udpSend = new CastorUDPSend(person);
		udpSend.send();
		
		CastorUDPSend udpSend1 = new CastorUDPSend(person);
		udpSend1.send();
		
	}
	
	/**
	 * 使用映射文件方式的编组与解编
	 */
	private static void Mapping() {
		
		//注意：当使用Marshaller和Unmarshaller的静态方法时，即使指定了映射定义文件，此映射定义也会被忽略。
		try {
			// 加载映射文件 
			Mapping mapping = new Mapping();
			mapping.loadMapping("mapping.xml");
			
			// 为待解编的XML文档构建一个Reader,此处多会使用StringReader
			FileReader reader = new FileReader(System.getProperty("user.dir") + "/CastorTest.xml");
			
			// 构建一个解编器 Unmarshaller 
			Unmarshaller unm = new Unmarshaller(Object.class);
			unm.setMapping(mapping);
			
			// 解编XML文档为Object对象
			Object target = unm.unmarshal(reader);
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (MappingException e) {
			e.printStackTrace();
		} catch (MarshalException e) {
			e.printStackTrace();
		} catch (ValidationException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 自省方式（introspection）的编组与解编
	 * 内省模式的缺点：
			1、Java 类及属性与XML文档的元素、属性之间的绑定的命名规则是由Castor XML框架定义的，这是可能改变的，如果改变了，已有代码可能不能运行。
			2、如果XML文档的元素、属性名是我们无法控制的，则无法解决。
			3、无法解决一个Java 类映射到多个平台的XML文档（每个平台的XML文档都不同）的情况
	 */
	private static void Introspection() {
		try {
			
			//将JavaBean转换为XML
			//将new Object()对象转为XML，存入当前目录下的CastorTest.xml中,此处多会使用StringWriter
			Marshaller.marshal(new Object(), new FileWriter(System.getProperty("user.dir") + "/CastorTest.xml"));
			
			//将XML转换为JavaBean,此处多会使用StringReader
			Object target = new Object();
			target = Unmarshaller.unmarshal(Object.class, new FileReader(System.getProperty("user.dir") + "/CastorTest.xml"));
		
		} catch (MarshalException e) {
			e.printStackTrace();
		} catch (ValidationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

